package bengxn

import (
	"fmt"
	"math"
	"server/aa_model"
	"server/amtf"
	"server/global"
	"server/model/common/response"
	"server/model/system"
	"sort"

	"github.com/gin-gonic/gin"
)

var A手动挡 *amtf.S组件手动挡

func init() {
	A手动挡 = &amtf.S组件手动挡{}
	A手动挡.A注册 = A注册
}

func A注册(PrivateGroup *gin.RouterGroup, PublicGroup *gin.RouterGroup, engine *gin.Engine, 插件 *amtf.S插件, 组件 *amtf.S组件) {
	// 标题 := 组件.A标题
	// if 标题 == "" {
	// 	标题 = 组件.A名称
	// }

	页面名 := "选型"
	页面英文名 := "xuanxing"

	api路径 := fmt.Sprintf("%s/%s/%s", 插件.A英文名, 组件.A英文名, 页面英文名)
	PublicGroup.GET(页面英文名, A查泵性能)

	menus := []system.SysBaseMenu{}
	前端路由path := 组件.A英文名 + "/" + 页面英文名
	前端路由名 := fmt.Sprintf("%s.%s.%s", 组件.A插件名, 组件.A名称, 页面名)
	menus = append(menus, system.SysBaseMenu{
		MenuLevel: 0, Hidden: false, A公开: true, Path: 前端路由path, Name: 前端路由名, Component: "找aa", Sort: 1, ParentId: 插件.Amenu.ID, Meta: system.Meta{Title: 页面名, Icon: 组件.A图标, KeepAlive: true, Aapi路径: api路径, A页面类型: "详情"},
	})
	amtf.A注册目录_多个(menus)

}

type req单项 struct {
	A流量 float64 `json:"流量" form:"流量"`
	A扬程 float64 `json:"扬程" form:"扬程"`
}

func A查泵性能(c *gin.Context) {
	var req = req单项{}
	err := c.ShouldBindQuery(&req)
	fmt.Printf("err 👉 %+v\n", err)

	model := &aa_model.S项目管理之泵性能model{}
	var pumpModels []string
	// 先查询出所有不同的泵型号
	err = global.A_DB.Model(model).
		Select("DISTINCT 泵型号").
		Pluck("泵型号", &pumpModels).Error
	if err != nil {
		response.FailWithMessage("查询泵型号失败: "+err.Error(), c)
		return
	}

	res := map[string][]*aa_model.S项目管理之泵性能model{}
	目标流量 := req.A流量
	目标扬程 := req.A扬程

	for _, 泵型号 := range pumpModels {
		var models []*aa_model.S项目管理之泵性能model
		err := global.A_DB.Where("泵型号 =?", 泵型号).Order("流量").Find(&models).Error
		if err != nil {
			response.FailWithMessage("查询泵性能失败: "+err.Error(), c)
			return
		}

		// 找到最接近的两个数据点
		var closestData1, closestData2 *aa_model.S项目管理之泵性能model
		minDiff1, minDiff2 := math.Inf(1), math.Inf(1)
		for _, item := range models {
			diff := math.Abs(float64(item.A流量 - 目标流量))
			if diff < minDiff1 {
				closestData2 = closestData1
				minDiff2 = minDiff1
				closestData1 = item
				minDiff1 = diff
			} else if diff < minDiff2 {
				closestData2 = item
				minDiff2 = diff
			}
		}

		if closestData1 != nil && closestData2 != nil {
			// 按扬程排序，然后取第一个和最后一个
			sortModelsByHead(models)
			minHead := float64(models[0].A扬程)
			maxHead := float64(models[len(models)-1].A扬程)

			// 检查目标扬程是否在数据范围内
			if 目标扬程 < minHead || 目标扬程 > maxHead {
				continue
			}

			flowDiff := float64(closestData2.A流量 - closestData1.A流量)
			flowWeight := (float64(目标流量) - float64(closestData1.A流量)) / flowDiff
			效率 := closestData1.A效率 + flowWeight*(closestData2.A效率-closestData1.A效率)
			效率 = amtf.A圆整(效率, 1)
			Npshr := closestData1.Npshr + flowWeight*(closestData2.Npshr-closestData1.Npshr)
			Npshr = amtf.A圆整(Npshr, 1)

			newModel := &aa_model.S项目管理之泵性能model{
				A流量:   目标流量,
				A扬程:   目标扬程,
				A效率:   效率,
				Npshr: Npshr,
			}
			models = append(models, newModel)
			sortModelsByFlow(models)
		} else {
			continue
		}
		res[泵型号] = models
	}
	response.OkWithDetailed(res, "获取成功", c)
}

// 按扬程对模型切片进行排序
func sortModelsByHead(models []*aa_model.S项目管理之泵性能model) {
	sort.Slice(models, func(i, j int) bool {
		return models[i].A扬程 < models[j].A扬程
	})
}

// 按流量对模型切片进行排序
func sortModelsByFlow(models []*aa_model.S项目管理之泵性能model) {
	sort.Slice(models, func(i, j int) bool {
		return models[i].A流量 < models[j].A流量
	})
}

func A查泵性能f(c *gin.Context) {
	model := &aa_model.S项目管理之泵性能model{}
	var pumpModels []string
	// 先查询出所有不同的泵型号
	err := global.A_DB.Model(model).
		Select("DISTINCT 泵型号").
		Pluck("泵型号", &pumpModels).Error
	if err != nil {
		response.FailWithMessage("查询泵型号失败: "+err.Error(), c)
		return
	}

	res := map[string][]*aa_model.S项目管理之泵性能model{}
	for _, 泵型号 := range pumpModels {
		var models []*aa_model.S项目管理之泵性能model
		err := global.A_DB.Where("泵型号 = ?", 泵型号).Order("流量").Find(&models).Error
		if err != nil {
			response.FailWithMessage("查询泵性能失败: "+err.Error(), c)
			return
		}
		res[泵型号] = models
	}

	response.OkWithDetailed(res, "获取成功", c)
}
